#include<stdio.h>
/*
思路：
找到最后一个满足nums[i]<nums[i+1]地方。且如果后面还元素，必然满足nums[i]<nums[i+1]；
我们只需要在后面的数组元素中找到nums[k]>nums[i]的最小值,然后交换nums[i]和nums[k]交换位置。
此时从i+1，必然都是降序的，所以只需要将i+1，到numsSize-1的元素进行升序排序即可。



*/
void nextPermutation(int* nums, int numsSize) {
    int big = 0;
    int small = 0;
    int temp =0;
    int left = 0;
    int right = numsSize-1;
    
    for(int i=0;i<(numsSize-1);i++){
        if(nums[i]<nums[i+1]){
            small = i;
            big = i+1;
        }
    }
    if(0==big){
        while(left<right){
            temp = nums[right];
            nums[right] = nums[left];
            nums[left] = temp;
            left++;
            right--;
        }

    }else{      
            for(int j=(big+1);j<numsSize;j++){                                                                 
                if(nums[j]>nums[small]){
                    big = j;
                }
            } 
            temp = nums[big];
            nums[big] = nums[small];
            nums[small] = temp;
            nextPermutation(&(nums[small+1]),(numsSize-1-small));    
    }
}
int main()
{ 
    int nums[] ={5,4,7,5,3,2};
    int size = sizeof(nums)/sizeof(int);
    nextPermutation(nums,size);

    for(int i=0;i<size;i++)
    {
        printf("%d \n",nums[i]);
    }
}